package com.mrs.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.mrs.common.constants.SystemConstants;
import com.mrs.entity.Menu;
import com.mrs.mapper.MenuMapper;
import com.mrs.service.MenuService;
import com.mrs.utils.SecurityUtils;
import org.springframework.stereotype.Service;

import java.util.List;
import java.util.stream.Collectors;

/**
 * 菜单权限表(Menu)表服务实现类
 *
 * @author makejava
 * @since 2022-09-10 16:41:04
 */
@Service("menuService")
public class MenuServiceImpl extends ServiceImpl<MenuMapper, Menu> implements MenuService {

    /**
     * @param userId
     * @description: 获取用户的权限列表
     * @return: java.util.List<java.lang.String>
     * @author: MR.孙
     * @date: 2022/9/10 17:00
     */
    @Override
    public List<String> selectPermissionByUserId(Long userId) {
        //如果是管理员(用户id为1),返回所有权限
        if (SecurityUtils.isAdmin()) {
            //添加查询条件
            LambdaQueryWrapper<Menu> queryWrapper = new LambdaQueryWrapper<>();
            //菜单类型是 C 或 F 也就是菜单或者按钮
            queryWrapper.in(Menu::getMenuType, SystemConstants.Menu, SystemConstants.Button_TYPE);
            //并且菜单状态为0(正常)
            queryWrapper.eq(Menu::getStatus, SystemConstants.STATUS_NORMAL);
            List<Menu> menuList = list(queryWrapper);

            //提取需要的权限列表
            List<String> permissions = menuList.stream()
                    .map((menu) -> {
                        return menu.getPerms();
                    }).collect(Collectors.toList());
            return permissions;
        }
        //否则返回用户对应的权限列表
        //BaseMapper就是当前MenuServiceImpl对应的MenuMapper
        List<String> permissions = getBaseMapper().selectPermissions(userId);
        return permissions;
    }


    /**
     * @param userId
     * @description: 动态路由信息，不同用户显示不同路由菜单
     * @return: java.util.List<com.mrs.entity.Menu>
     * @author: MR.孙
     * @date: 2022/9/10 20:59
     */
    @Override
    public List<Menu> selectMenuRoutesTreeByUserId(Long userId) {

        MenuMapper menuMapper = getBaseMapper();
        List<Menu> menus = null;
        //判断当前用户是否为超级管理员admin
        if (SecurityUtils.isAdmin()) {
            //如果是admin用户则返回全部的menu
            menus = menuMapper.selectAllMenuRoutes();
        } else {
            //否则， 则返回当前用户具有的menu
            menus = menuMapper.selectRoutesMenuByUserId(userId);
        }

        //构建tree形式
        //先找出第一层菜单,去找到它们的子菜单并设置到children中
        List<Menu> menuTree = buildMenuTree(menus, 0L);

        //封装数据并返回
        return menuTree;
    }

    /**
     * @description: 构建tree形式
     * @param menus
     * @param parentId
     * @return: java.util.List<com.mrs.entity.Menu>
     * @author: MR.孙
     * @date: 2022/9/11 8:38
    */
    private List<Menu> buildMenuTree(List<Menu> menus, Long parentId) {
        List<Menu> MenuTree = menus.stream()
                //1.先找出第一层菜单
                .filter(menu -> menu.getParentId().equals(parentId))
                //2. 根据parentId找到它的子菜单,并设置给children
                .map(menu -> menu.setChildren(getChildrenMenu(menu, menus)))
                .collect(Collectors.toList());
        return MenuTree;
    }


    /**
     * @description:  获取所有子菜单
     * @param menu 所有的一级菜单
     * @param menus 该用户所有的menu
     * @return: java.util.List<com.mrs.entity.Menu>
     * @author: MR.孙
     * @date: 2022/9/11 8:58
    */
    private List<Menu> getChildrenMenu(Menu menu, List<Menu> menus) {
        //根据parentId找到它的子菜单
        List<Menu> childrenMenu = menus.stream()
                .filter(m -> m.getParentId().equals(menu.getId()))
                //有可能不止二级菜单,所以这里递归找到所有的children
                .map(m->m.setChildren(getChildrenMenu(m,menus)))
                .collect(Collectors.toList());

        return childrenMenu;
    }

}
